# strategy.py
import numpy as np
import pandas as pd
from typing import List
from factors import Factor


class Strategy:
    """
    组合并应用一个或多个因子来生成最终交易信号。
    """

    def __init__(self, factors: List[Factor]):
        if not factors:
            raise ValueError("策略必须至少包含一个因子。")
        self.factors = factors

    def generate_signals(self, data: pd.DataFrame) -> pd.DataFrame:
        """
        运行所有因子并合成最终交易信号。

        :param data: 市场数据。
        :return: 一个包含 'signal' 列的DataFrame。
        """
        all_factor_signals = []
        for factor in self.factors:
            # 计算每个因子的信号
            factor_signal = factor.calculate(data)
            all_factor_signals.append(factor_signal)

        # 合并所有因子的信号到一个DataFrame
        combined_signals = pd.concat(all_factor_signals, axis=1)

        # --- 信号合成逻辑 ---
        # 简单投票/平均法：将所有因子信号相加。
        # 如果总和 > 0, 做多 (1)
        # 如果总和 < 0, 做空 (-1)
        # 如果总和 = 0, 平仓/无操作 (0)
        final_signal = np.sign(combined_signals.sum(axis=1))

        signals_df = pd.DataFrame(index=data.index)
        signals_df['signal'] = final_signal

        return signals_df